/*
 * ElevatorProxy.h
 *
 */

#ifndef ELEVATORPROXY_H_
#define ELEVATORPROXY_H_

#include <iostream>
#include <sys/types.h>
#include <vector>
#include "../common/Object.h"
#include "ApplicationCommon.h"
#include "ElevatorComunicator.h"

class ElevatorProxy: public Object
{
	typedef std::vector<ElevatorComunicator *> ElevatorDestinationCommunicatorVector;

public:
	/**
	 *
	 */
	ElevatorProxy(int floorAmmount,int elevatorAmmount,float elevatorSpeed,
					float maxElevatorCapacity,
					std::string floorBaseFileName, std::string keyGenerationPath);

	/**
	 *
	 */
	virtual ~ElevatorProxy();

	void setHallCalls(ElevatorIdentifier elevatorId,
							FloorIdentifierList destinations );

	FloorIdentifierList getHallCalls(ElevatorIdentifier elevatorId);

	void setAllCalls(ElevatorIdentifier elevatorId,
							FloorIdentifierList destinations );

	FloorIdentifierList getAllCalls(ElevatorIdentifier elevatorId);

	void setElevatorStatus(ElevatorStatus &status, ElevatorIdentifier elevatorId);

	ElevatorStatus getElevatorStatus(ElevatorIdentifier elevatorId);

    /**
     * Inicia los pisos, instanciando todos los procesos y
     * mecanismos de control necesarios
     */
    void start();

    /**
     * Detiene a los pisos, para todos los procesos hijos y
     * destruye las estructuras de control utilizadas
     */
    void stop();

    int getElevatorAmmount();

private:
    /**
     *
     */
    int m_floorAmmount;

    /**
     *
     */
    int m_ElevatorAmmount;


    float m_elevatorSpeed;

    float m_maxElevatorCapacity;

	/**
	 * Vector con los pids de todos los procesos hijos
	 */
    std::vector<pid_t> m_PidVector;

    /**
     * Path de base, a partir del cual se crearan los pisos
     * y mecanismos de control.
     * Los pisos tendran un nombre de la forma:
     * "m_BaseFileName+numPiso"
     */
    std::string m_elevatorBaseFileName;

    std::string m_floorBaseFileName;

    /**
     *
     */
    bool m_IsRunning;

	/**
	 * Vector con los pids de todos los procesos hijos
	 */
    ElevatorDestinationCommunicatorVector m_elevatorDestinationCommunicationVector;

    std::string m_keyGenerationPath;
};

#endif /* ELEVATORPROXY_H_ */
